﻿// 301 字符串匹配例题.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>

using namespace std;
/*
http://oj.daimayuan.top/course/22/problem/908

给你两个字符串 a,b
，字符串均由小写字母组成，现在问你 b
 在 a
 中出现了几次。

输入有多组数据，第一行为数据组数 T
，每组数据包含两行输入，第一行为字符串 a
，第二行为字符串 b
。

对于每组输入需要输出两行，其中第一行为出现次数，第二行为每次出现时第一个字符在 a
 中的下标（字符串首位的下标为 1
）。如果找不到，输出两行 −1
。

输入格式
第一行一个整数 T
。

接下来 2T
 行，每行一个字符串。

输出格式
输出 2T
 行，每行若干个整数，详见题面。

样例输入
3
abababa
aba
aaaaaa
bb
abcabcab
abcab
样例输出
3
1 3 5
-1
-1
2
1 4
数据规模
对于所有数据，保证 1≤T≤10
，1≤|a|,|b|≤105
，字符串均由小写字母构成。
*/

int t, n, m, nxt[100001], f[100001];
char s[100002], p[100002];

void kmp() {
	n = strlen(s + 1);
	m = strlen(p + 1);
	int j = 0;
	nxt[1] = 0;
	for (int i = 2; i <= m; i++) {
		while (j && p[i] != p[j + 1])
			j = nxt[j];
		if (p[i] == p[j + 1])
			++j;
		nxt[i] = j;
	}

	j = 0;
	for (int i = 1; i <= n; i++) {
		while (j == m || (j && s[i] != p[j + 1]))
			j = nxt[j];
		if (s[i] == p[j + 1])
			++j;
		f[i] = j;
	}

	int ans = 0;
	for (int i = 1; i <= n; i++)
		if (f[i] == m)
			++ans;
	if (!ans)
		printf("-1\n-1\n");
	else {
		printf("%d\n",ans);
		for (int i = 1; i <= n; i++)
			if (f[i] == m)
				printf("%d ", i - m + 1);
		printf("\n");
	}
	return ;
}


int main()
{
	scanf("%d", &t);
	for (; t--;) {
		scanf("%s%s", s + 1, p + 1);
		kmp();
	}

	return 0;
}
 